package zuosheng.day4;

/**
 * @author lj
 * @Description: 用数组结构实现大小固定的队列和栈
 * @date 2020-11-03 14:12
 * @QQ 851477108
 */


public class Array_To_Stack_Queue {

    public static class ArrayStack{
        //数组作为栈
        private Integer[] arr;
        //index相当于一个指针,表示入栈时的元素所进栈的位置
        //入栈时index加1,出栈时index减1,栈顶位置index-1
        private Integer index;

        //构造函数-初始化栈
        public ArrayStack(int initSize){
            //给定的初始值<0,报错
            if (initSize < 0){
                throw new IllegalArgumentException("The init size is less than 0");
            }
            arr = new Integer[initSize];
            index = 0;
        }

        //入栈
        public void push(int object){
            //index=数组长度大小(栈大小),说明栈已满
            if (index == arr.length){
                throw new ArrayIndexOutOfBoundsException("The queue is full");
            }
            //将object放入数组中后,index指针加1
            arr[index++] = object;
        }

        //出栈
        public Integer pop(){
            //index=0,栈为空,不能出栈
            if (index == 0){
                throw new ArrayIndexOutOfBoundsException("The queue is empty");
            }
            //将数组index指针位置减1的栈顶元素弹出
            return arr[--index];
        }
    }


    public static class ArrayQueue {
        private Integer[] arr;
        //记录队列中的元素数目
        private Integer size;
        //出队,来跟踪队列中的数
        private Integer start;
        //进队,来跟踪队列中的数
        private Integer end;


        //初始化队列
        public ArrayQueue(int initSize){
            if (initSize < 0){
                // 如果给定的值 < 0，报错
                throw new IllegalArgumentException("The init size is less than 0");
            }
            arr = new Integer[initSize];
            size = 0;
            start = 0;
            end = 0;
        }

        //进队列
        public void push(int object){
            if (size == arr.length){
                // 如果 size 等于队列长度，说明队列已满，不能进队列，报错。
                throw new ArrayIndexOutOfBoundsException("The queue is full");
            }
            size++;
            arr[end] = object;
            //判断end是否在最后一个位置
            boolean flag = end == arr.length - 1;
            //在就end开头,不在end+1
            end = flag ? 0 : end + 1;
        }

        //出队列
        public Integer poll(){
            if (size == 0){
                // 如果 size 等于 0 ，说明队列为空，不能出队列，报错
                throw new ArrayIndexOutOfBoundsException("The queue is empty");
            }
            size--;
            //需要输出的是start位置的数值
            int temp = start;
            //判断start是否在最后一个位置
            boolean flag = start == arr.length - 1;
            //在就start开头,不在start+1
            start = flag ? 0 : start + 1;
            return arr[temp];
        }

        //返回队头
        public Integer peek(){
            if (size == 0){
                return null;
            }
            return arr[start];
        }
    }
}
